package model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * Classe créant les différentes instances d'Agence (classe Agence définie en interne) Pattern Flywieght
 */
public class AgenceManager {
	private HashMap<String, Agence> poolAgence;
	
	private static AgenceManager factory = new AgenceManager();
	private static List<String> listeIdentifiantAgence;
	
	private AgenceManager(){
		poolAgence = new HashMap<String, Agence>();
		listeIdentifiantAgence = new ArrayList<String>();
		genererListeAgence();
	}
	/**
	 * @param String l'identifiant de l'agence souhaitee
	 * @return l' Agence souhaitée
	 */
	public synchronized Agence getAgence(String identifiant){
		if(poolAgence.get(identifiant)==null){
			Agence a = new Agence();
			a.generer(identifiant);
			poolAgence.put(identifiant,a);
			return a;			
		}else{
			return poolAgence.get(identifiant);
		}
	}
	/**
	 * @return toutes les Agences
	 */
	public synchronized List<Agence> getAllAgence(){
		List<Agence> toutesLesAgences = new ArrayList<Agence>();
		for(String s : listeIdentifiantAgence){
			toutesLesAgences.add(getAgence(s));
		}
		return toutesLesAgences;		
	}
	
	/**
	 * @return the factory
	 */
	public static AgenceManager getInstance() {
		return factory;
	}
	/**
	 * Generation des identifiants de toutes les agences
	 */
	public void genererListeAgence(){
		listeIdentifiantAgence.add("Agence1");
		listeIdentifiantAgence.add("Agence2");
		listeIdentifiantAgence.add("Agence3");
	}
	/**
	 * @param identifiant de l'Agence
	 * @return List<Demandeur> la liste des Demandeurs de l'Agence
	 */
	public List<Demandeur> getListeDemandeur(String identifiant){
		return getAgence(identifiant).getListeDemandeur();
	}
	/**
	 * @param identifiant de l'Agence
	 * @return List<Entreprise> la liste des Entreprises de l'Agence
	 */
	public List<Entreprise> getListeEntreprise(String identifiant){
		return getAgence(identifiant).getListeEntreprise();
	}
	/**
	 * @param identifiant de l'Agence
	 * @return List<Personnel> la liste du Personnel de l'Agence
	 */
	public List<Personnel> getListePersonnel(String identifiant){
		return getAgence(identifiant).getListePersonnel();
	}
	
	/**
	 * @param identifiant de l'Agence
	 * @return List<Offre> la liste des Offres de l'Agence
	 */
	public List<Offre> getListeOffre(String identifiant){
		return getAgence(identifiant).getListeOffre();
	}
	/**
	 * 
	 * @return toutes les Offre de toutes les Agence
	 */
	public List<Offre> GetAllOffre(){
		List<Offre> toutesLesOffres = new ArrayList<Offre>();
		for(Agence a : getAllAgence()){
			for(Offre o : a.getListeOffre()){
				toutesLesOffres.add(o);
			}
		}
		return toutesLesOffres;
	}
	
	/**
	 * @param identifiant de l'Agence
	 * @return the prixAnnonce
	 */
	public float getPrixAnnonce(String identifiant){
		return getAgence(identifiant).getPrixAnnonce();
	}
	
	/**
	 * Classe regroupant Regroupe les éléments constitutifs d'une agence
	 */
	private class Agence {
		
		
		private List<Personnel> listePersonnel ;
		private List<Entreprise> listeEntreprise ;
		private List<Demandeur> listeDemandeur ;
		private List<Offre> listeOffre;
		private String identifiant;
		private float prixAnnonce;
		
		private Agence() {
			listePersonnel = new ArrayList<Personnel>();
			listeEntreprise = new ArrayList<Entreprise>();
			listeDemandeur = new ArrayList<Demandeur>();
			listeOffre = new ArrayList<Offre>();
			
			
		}
		 
		private Agence(List<Personnel> l_per,List<Entreprise> l_ent, List<Demandeur> l_dem,List<Offre> l_offre){
			listePersonnel = l_per ;
			listeEntreprise = l_ent ;
			listeDemandeur = l_dem ;
			listeOffre = l_offre;
		}
		
		private void generer(String identifiant){
			
		}
		
		private List<Demandeur> getListeDemandeur() {
			return listeDemandeur;
		}
		
		private List<Entreprise> getListeEntreprise() {
			return listeEntreprise;
		}
		
		private List<Personnel> getListePersonnel() {
			return listePersonnel;
		}		

		
		/**
		 * @return the identifiant
		 */
		private String getIdentifiant() {
			return identifiant;
		}

		/**
		 * @param prixAnnonce the prixAnnonce to set
		 */
		private void setPrixAnnonce(float prixAnnonce) {
			this.prixAnnonce = prixAnnonce;
		}

		/**
		 * @return the prixAnnonce
		 */
		private float getPrixAnnonce() {
			return prixAnnonce;
		}
		

		/**
		 * @return the listeOffre
		 */
		private List<Offre> getListeOffre() {
			return listeOffre;
		}
		
	}

}
